/*
* Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef _MOVEMENT_STRUCTURES_H
#define _MOVEMENT_STRUCTURES_H

enum MovementStatusElements
{
    MSEHasGuidByte0,
    MSEHasGuidByte1,
    MSEHasGuidByte2,
    MSEHasGuidByte3,
    MSEHasGuidByte4,
    MSEHasGuidByte5,
    MSEHasGuidByte6,
    MSEHasGuidByte7,
    MSEHasMovementFlags,
    MSEHasMovementFlags2,
    MSEHasTimestamp,
    MSEHasOrientation,
    MSEHasTransportData,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte7,
    MSEHasTransportTime2,
    MSEHasTransportTime3,
    MSEHasPitch,
    MSEHasFallData,
    MSEHasFallDirection,
    MSEHasSplineElevation,
    MSEHasSpline,
    MSEHasAlive32,

    MSEGuidByte0,
    MSEGuidByte1,
    MSEGuidByte2,
    MSEGuidByte3,
    MSEGuidByte4,
    MSEGuidByte5,
    MSEGuidByte6,
    MSEGuidByte7,
    MSEMovementFlags,
    MSEMovementFlags2,
    MSETimestamp,
    MSEPositionX,
    MSEPositionY,
    MSEPositionZ,
    MSEOrientation,
    MSETransportGuidByte0,
    MSETransportGuidByte1,
    MSETransportGuidByte2,
    MSETransportGuidByte3,
    MSETransportGuidByte4,
    MSETransportGuidByte5,
    MSETransportGuidByte6,
    MSETransportGuidByte7,
    MSETransportPositionX,
    MSETransportPositionY,
    MSETransportPositionZ,
    MSETransportOrientation,
    MSETransportSeat,
    MSETransportTime,
    MSETransportTime2,
    MSETransportTime3,
    MSEPitch,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSESplineElevation,
    MSEBitCounter1,
    MSEBitCounterLoop1,
    MSEAlive32,
    // Special
    MSEFlushBits,   //FlushBits()
    MSEZeroBit, // writes bit value 1 or skips read bit
    MSEOneBit,  // writes bit value 0 or skips read bit
    MSEEnd,     // marks end of parsing
    MSE_COUNT
};

//5.0.5 16048 //TODO FIX ME unkvalues
MovementStatusElements MovementStartForwardSequence[] =
{
    MSEPositionX,
    MSEPositionY,
    MSEPositionZ,
    

    MSEHasGuidByte1, //guid1
    MSEHasSplineElevation,      //_AH & 0x44
    MSEHasMovementFlags, //MoveFlags
    MSEHasGuidByte6,    //guid6
    MSEZeroBit,      //isAlive_unk1
    MSEHasGuidByte3,    //guid3
    MSEHasPitch,      //_AH & 0x44
    MSEHasGuidByte5,    //guid5

    MSEHasGuidByte2,    //guid2
    MSEHasMovementFlags2,//MoveFlags2
    MSEHasFallData,     //IsInterpolated
    MSEZeroBit,      //isAlive_unk4
    MSEHasAlive32,       //isAlive32
    MSEHasTransportData,    //isTransport
    MSEHasGuidByte4,//guid4
    //BitCounter1
    MSEBitCounter1,
    MSEHasGuidByte0,//guid0

    MSEZeroBit,       //isAlive_unk2
    MSEHasTimestamp,       //nisAlive_unk3
    MSEHasOrientation,     //_AH & 0x44
    MSEHasGuidByte7,        //guid7
    MSEHasTransportTime2,         //transport_unk1
    MSEHasTransportGuidByte7,//transport guid 7
    MSEHasTransportGuidByte1,//transport guid 1
    MSEHasTransportGuidByte5,//transport guid 5
    MSEHasTransportGuidByte4,//transport guid 4
    MSEHasTransportGuidByte6,//transport guid 6
    MSEHasTransportGuidByte0,//transport guid 0
    MSEHasTransportGuidByte3,//transport guid 3
    MSEHasTransportTime3,     //transport_unk2
    MSEHasTransportGuidByte2,//transport guid 2
    MSEMovementFlags,
    MSEMovementFlags2,
    MSEHasFallDirection,           //isFalling
    MSEFlushBits,

    MSEGuidByte2,
    MSEGuidByte4,
    MSEGuidByte0,
    MSEGuidByte1,
    MSEGuidByte5,
    MSEGuidByte7,
    MSEGuidByte6,
    //if bitCounter1 then do while.
    MSEGuidByte3,
    MSETransportOrientation,
    MSETransportGuidByte7,
    MSETransportPositionY,
    MSETransportGuidByte6,
    MSETransportGuidByte5,
    MSETransportGuidByte4,
    MSETransportGuidByte3,
    MSETransportGuidByte1,
    MSETransportPositionX,
    MSETransportTime,
    MSETransportGuidByte0,
    MSETransportGuidByte2,
    MSETransportSeat,
    MSETransportPositionZ,

    MSEFallCosAngle,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSEAlive32,
    MSEPitch,
    MSESplineElevation,
    MSEOrientation,
    MSETimestamp,

    MSEEnd,
};

//5.0.5 16048
MovementStatusElements PlayerMoveSequence[] =
{
    MSEZeroBit,             //isAlive_unk1
    MSEHasGuidByte4,        //guid4
    MSEHasAlive32,             //isAlive32
    MSEZeroBit,              //isAlive_unk2
    MSEHasSplineElevation,  //SplineElevation inverse
    MSEHasMovementFlags,    //!MoveFlags
    MSEHasOrientation,      //MSEHasOrientation
    MSEHasGuidByte2,        //guid2

    MSEHasPitch,            //Pitch
    MSEHasGuidByte3,        //guid3
    MSEHasGuidByte1,        //guid1
    MSEMovementFlags,       //MoveFlags 30bits
    MSEHasGuidByte5,        //guid5
    MSEHasTransportData,    //isTransport
    MSEHasTransportGuidByte1,//TransGuid1
    MSEHasTransportGuidByte3,//TransGuid3
    MSEHasTransportGuidByte0,//TransGuid0


    MSEHasTransportTime2,    //transport_unk1
    MSEHasTransportGuidByte4,//TransGuid4
    MSEHasTransportGuidByte7,//TransGuid7
    MSEHasTransportGuidByte5,//TransGuid5
    MSEHasTransportTime3,    //transport_unk2
    MSEHasTransportGuidByte6,//TransGuid6
    MSEHasTransportGuidByte2,//TransGuid2
    MSEHasMovementFlags2,    //MoveFlags2

    MSEHasTimestamp,        //nisAlive_unk3
    MSEHasGuidByte0,        //guid0
    MSEMovementFlags2,      //MoveFlags2
    MSEHasFallData,         //IsInterpolated
    MSEHasFallDirection,    //isFalling
    MSEZeroBit,


    MSEBitCounter1,
    //EndBitCounter1

    MSEHasGuidByte7,    //guid7
    MSEHasGuidByte6,    //guid6

    MSETransportGuidByte6,  //transguid6
    MSETransportGuidByte1,  //transguid1
    MSETransportOrientation,    //TransOrientation
    MSETransportGuidByte7,  //transguid7
    MSETransportTime,           //TransTime
    MSETransportGuidByte2,  //transguid2
    MSETransportGuidByte3,  //transguid3
    MSETransportPositionX,  //transX
    MSETransportGuidByte0,  //transguid0
    MSETransportGuidByte4,  //transguid4
    MSETransportPositionY,  //TransportY
    MSETransportPositionZ,  //TransportZ
    MSETransportGuidByte5,  //transguid5
    MSETransportSeat,       //transSeat
    MSEHasTransportTime3,

    MSESplineElevation,     //SplineElevation
    MSETimestamp,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSEFallCosAngle,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSEGuidByte3,
    MSEGuidByte4,
    MSEGuidByte2,
    MSEAlive32,
    MSEGuidByte7,
    MSEOrientation,
    MSEPositionY,
    MSEGuidByte1,
    MSEPitch,
    MSEPositionX,
    MSEGuidByte0,
    MSEPositionZ,
    MSEGuidByte6,
    MSEGuidByte5,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementFallLandSequence[] =
{
    MSEPositionX,
    MSEPositionY,
    MSEPositionZ,
    MSEHasTransportData,
    MSEHasGuidByte7,
    MSEHasGuidByte1,
    MSEHasMovementFlags2,
    MSEHasGuidByte3,
    MSEHasSplineElevation,
    MSEHasOrientation,
    MSEHasGuidByte6,
    MSEHasTimestamp,
    MSEZeroBit,
    MSEHasPitch,
    MSEHasGuidByte4,
    MSEHasSpline,
    MSEHasGuidByte5,
    MSEHasMovementFlags,
    MSEHasFallData,
    MSEHasGuidByte0,
    MSEHasGuidByte2,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte2,
    MSEHasTransportTime3,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte7,
    MSEMovementFlags2,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEGuidByte1,
    MSEGuidByte7,
    MSEGuidByte4,
    MSEGuidByte3,
    MSEGuidByte6,
    MSEGuidByte0,
    MSEGuidByte2,
    MSEGuidByte5,
    MSETransportTime,
    MSETransportPositionZ,
    MSETransportPositionY,
    MSETransportPositionX,
    MSETransportGuidByte5,
    MSETransportTime3,
    MSETransportGuidByte1,
    MSETransportSeat,
    MSETransportTime2,
    MSETransportGuidByte4,
    MSETransportOrientation,
    MSETransportGuidByte0,
    MSETransportGuidByte7,
    MSETransportGuidByte3,
    MSETransportGuidByte6,
    MSETransportGuidByte2,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSEFallCosAngle,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSESplineElevation,
    MSETimestamp,
    MSEPitch,
    MSEOrientation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementHeartBeatSequence[] =
{
    MSEPositionZ,
    MSEPositionX,
    MSEPositionY,
    MSEHasPitch,
    MSEHasTimestamp,
    MSEHasFallData,
    MSEHasMovementFlags2,
    MSEHasTransportData,
    MSEHasGuidByte7,
    MSEHasGuidByte1,
    MSEHasGuidByte0,
    MSEHasGuidByte4,
    MSEHasGuidByte2,
    MSEHasOrientation,
    MSEHasGuidByte5,
    MSEHasGuidByte3,
    MSEHasSplineElevation,
    MSEHasSpline,
    MSEZeroBit,
    MSEHasGuidByte6,
    MSEHasMovementFlags,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte2,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte1,
    MSEHasFallDirection,
    MSEMovementFlags,
    MSEMovementFlags2,
    MSEGuidByte3,
    MSEGuidByte6,
    MSEGuidByte1,
    MSEGuidByte7,
    MSEGuidByte2,
    MSEGuidByte5,
    MSEGuidByte0,
    MSEGuidByte4,
    MSETransportPositionZ,
    MSETransportSeat,
    MSETransportOrientation,
    MSETransportGuidByte4,
    MSETransportPositionY,
    MSETransportTime,
    MSETransportPositionX,
    MSETransportGuidByte5,
    MSETransportGuidByte1,
    MSETransportGuidByte3,
    MSETransportGuidByte7,
    MSETransportTime3,
    MSETransportTime2,
    MSETransportGuidByte2,
    MSETransportGuidByte0,
    MSETransportGuidByte6,
    MSEOrientation,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallCosAngle,
    MSEPitch,
    MSESplineElevation,
    MSETimestamp,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementJumpSequence[] =
{
    MSEPositionY,
    MSEPositionX,
    MSEPositionZ,
    MSEHasTimestamp,
    MSEHasGuidByte5,
    MSEHasMovementFlags,
    MSEHasGuidByte4,
    MSEHasGuidByte6,
    MSEHasMovementFlags2,
    MSEHasGuidByte0,
    MSEHasTransportData,
    MSEHasGuidByte3,
    MSEHasPitch,
    MSEHasGuidByte7,
    MSEHasFallData,
    MSEHasSpline,
    MSEHasOrientation,
    MSEHasGuidByte1,
    MSEHasSplineElevation,
    MSEZeroBit,
    MSEHasGuidByte2,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte4,
    MSEHasTransportTime3,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte2,
    MSEHasFallDirection,
    MSEMovementFlags,
    MSEMovementFlags2,
    MSEGuidByte6,
    MSEGuidByte5,
    MSEGuidByte4,
    MSEGuidByte0,
    MSEGuidByte2,
    MSEGuidByte3,
    MSEGuidByte7,
    MSEGuidByte1,
    MSETransportGuidByte1,
    MSETransportGuidByte7,
    MSETransportPositionX,
    MSETransportGuidByte4,
    MSETransportTime3,
    MSETransportGuidByte0,
    MSETransportOrientation,
    MSETransportTime2,
    MSETransportTime,
    MSETransportGuidByte6,
    MSETransportPositionZ,
    MSETransportSeat,
    MSETransportPositionY,
    MSETransportGuidByte3,
    MSETransportGuidByte2,
    MSETransportGuidByte5,
    MSEPitch,
    MSETimestamp,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSESplineElevation,
    MSEOrientation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementSetFacingSequence[] =
{
    MSEPositionX,
    MSEPositionY,
    MSEPositionZ,
    MSEHasGuidByte6,
    MSEHasTransportData,
    MSEHasGuidByte4,
    MSEHasSpline,
    MSEHasGuidByte0,
    MSEHasOrientation,
    MSEHasTimestamp,
    MSEHasPitch,
    MSEHasMovementFlags2,
    MSEHasGuidByte5,
    MSEHasGuidByte7,
    MSEHasGuidByte2,
    MSEHasFallData,
    MSEHasSplineElevation,
    MSEHasMovementFlags,
    MSEHasGuidByte3,
    MSEZeroBit,
    MSEHasGuidByte1,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte0,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte1,
    MSEHasFallDirection,
    MSEMovementFlags2,
    MSEMovementFlags,
    MSEGuidByte6,
    MSEGuidByte7,
    MSEGuidByte2,
    MSEGuidByte0,
    MSEGuidByte4,
    MSEGuidByte1,
    MSEGuidByte5,
    MSEGuidByte3,
    MSETransportGuidByte0,
    MSETransportPositionX,
    MSETransportGuidByte1,
    MSETransportTime2,
    MSETransportGuidByte4,
    MSETransportPositionZ,
    MSETransportOrientation,
    MSETransportGuidByte2,
    MSETransportTime3,
    MSETransportGuidByte3,
    MSETransportSeat,
    MSETransportPositionY,
    MSETransportGuidByte5,
    MSETransportGuidByte6,
    MSETransportTime,
    MSETransportGuidByte7,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallCosAngle,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSESplineElevation,
    MSEOrientation,
    MSETimestamp,
    MSEPitch,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementSetPitchSequence[] =
{
    MSEPositionX,
    MSEPositionZ,
    MSEPositionY,
    MSEHasFallData,
    MSEHasMovementFlags,
    MSEHasGuidByte1,
    MSEHasOrientation,
    MSEHasGuidByte7,
    MSEHasGuidByte3,
    MSEHasMovementFlags2,
    MSEHasTransportData,
    MSEHasSplineElevation,
    MSEHasGuidByte6,
    MSEHasPitch,
    MSEHasGuidByte4,
    MSEHasSpline,
    MSEHasGuidByte2,
    MSEZeroBit,
    MSEHasTimestamp,
    MSEHasGuidByte0,
    MSEHasGuidByte5,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte5,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte7,
    MSEHasTransportTime2,
    MSEMovementFlags2,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEGuidByte3,
    MSEGuidByte7,
    MSEGuidByte1,
    MSEGuidByte6,
    MSEGuidByte0,
    MSEGuidByte5,
    MSEGuidByte2,
    MSEGuidByte4,
    MSETransportGuidByte4,
    MSETransportGuidByte3,
    MSETransportGuidByte6,
    MSETransportOrientation,
    MSETransportGuidByte1,
    MSETransportTime3,
    MSETransportTime,
    MSETransportGuidByte2,
    MSETransportPositionZ,
    MSETransportGuidByte0,
    MSETransportTime2,
    MSETransportPositionY,
    MSETransportGuidByte5,
    MSETransportSeat,
    MSETransportGuidByte7,
    MSETransportPositionX,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSEFallHorizontalSpeed,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEPitch,
    MSESplineElevation,
    MSETimestamp,
    MSEOrientation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartBackwardSequence[] =
{
    MSEPositionX,
    MSEPositionZ,
    MSEPositionY,
    MSEHasTransportData,
    MSEHasGuidByte3,
    MSEHasGuidByte0,
    MSEHasGuidByte2,
    MSEHasTimestamp,
    MSEHasGuidByte7,
    MSEHasPitch,
    MSEZeroBit,
    MSEHasMovementFlags,
    MSEHasOrientation,
    MSEHasSpline,
    MSEHasMovementFlags2,
    MSEHasFallData,
    MSEHasGuidByte5,
    MSEHasGuidByte1,
    MSEHasGuidByte4,
    MSEHasGuidByte6,
    MSEHasSplineElevation,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte1,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte4,
    MSEHasTransportTime3,
    MSEMovementFlags,
    MSEMovementFlags2,
    MSEHasFallDirection,
    MSEGuidByte6,
    MSEGuidByte7,
    MSEGuidByte4,
    MSEGuidByte1,
    MSEGuidByte5,
    MSEGuidByte0,
    MSEGuidByte2,
    MSEGuidByte3,
    MSETransportPositionZ,
    MSETransportGuidByte2,
    MSETransportTime3,
    MSETransportGuidByte0,
    MSETransportGuidByte5,
    MSETransportPositionY,
    MSETransportGuidByte1,
    MSETransportPositionX,
    MSETransportTime2,
    MSETransportGuidByte4,
    MSETransportOrientation,
    MSETransportSeat,
    MSETransportGuidByte7,
    MSETransportTime,
    MSETransportGuidByte6,
    MSETransportGuidByte3,
    MSEPitch,
    MSETimestamp,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallCosAngle,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSEOrientation,
    MSESplineElevation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartStrafeLeftSequence[] =
{
    MSEPositionZ,
    MSEPositionX,
    MSEPositionY,
    MSEHasSplineElevation,
    MSEHasGuidByte5,
    MSEHasPitch,
    MSEHasGuidByte6,
    MSEHasTimestamp,
    MSEHasGuidByte1,
    MSEZeroBit,
    MSEHasGuidByte4,
    MSEHasGuidByte0,
    MSEHasGuidByte2,
    MSEHasFallData,
    MSEHasOrientation,
    MSEHasGuidByte3,
    MSEHasMovementFlags2,
    MSEHasGuidByte7,
    MSEHasSpline,
    MSEHasMovementFlags,
    MSEHasTransportData,
    MSEHasFallDirection,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte7,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte0,
    MSEMovementFlags,
    MSEMovementFlags2,
    MSEGuidByte2,
    MSEGuidByte6,
    MSEGuidByte3,
    MSEGuidByte1,
    MSEGuidByte0,
    MSEGuidByte7,
    MSEGuidByte4,
    MSEGuidByte5,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSEFallCosAngle,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSETransportSeat,
    MSETransportGuidByte2,
    MSETransportTime2,
    MSETransportGuidByte3,
    MSETransportPositionZ,
    MSETransportTime3,
    MSETransportGuidByte0,
    MSETransportGuidByte7,
    MSETransportPositionY,
    MSETransportGuidByte5,
    MSETransportGuidByte1,
    MSETransportOrientation,
    MSETransportTime,
    MSETransportGuidByte6,
    MSETransportGuidByte4,
    MSETransportPositionX,
    MSETimestamp,
    MSEOrientation,
    MSEPitch,
    MSESplineElevation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartStrafeRightSequence[] =
{
    MSEPositionY,
    MSEPositionX,
    MSEPositionZ,
    MSEHasPitch,
    MSEHasGuidByte1,
    MSEHasOrientation,
    MSEHasGuidByte4,
    MSEHasSpline,
    MSEZeroBit,
    MSEHasGuidByte5,
    MSEHasFallData,
    MSEHasSplineElevation,
    MSEHasTimestamp,
    MSEHasMovementFlags,
    MSEHasGuidByte2,
    MSEHasGuidByte7,
    MSEHasGuidByte6,
    MSEHasGuidByte3,
    MSEHasMovementFlags2,
    MSEHasTransportData,
    MSEHasGuidByte0,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte0,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte4,
    MSEHasTransportTime3,
    MSEMovementFlags2,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEGuidByte7,
    MSEGuidByte5,
    MSEGuidByte3,
    MSEGuidByte1,
    MSEGuidByte2,
    MSEGuidByte4,
    MSEGuidByte6,
    MSEGuidByte0,
    MSETransportGuidByte5,
    MSETransportGuidByte1,
    MSETransportGuidByte6,
    MSETransportPositionY,
    MSETransportOrientation,
    MSETransportGuidByte0,
    MSETransportGuidByte2,
    MSETransportSeat,
    MSETransportPositionX,
    MSETransportTime3,
    MSETransportTime,
    MSETransportGuidByte4,
    MSETransportGuidByte7,
    MSETransportTime2,
    MSETransportPositionZ,
    MSETransportGuidByte3,
    MSEPitch,
    MSEOrientation,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSETimestamp,
    MSESplineElevation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartTurnLeftSequence[] =
{
    MSEPositionY,
    MSEPositionX,
    MSEPositionZ,
    MSEZeroBit,
    MSEHasGuidByte1,
    MSEHasOrientation,
    MSEHasSpline,
    MSEHasMovementFlags,
    MSEHasGuidByte4,
    MSEHasGuidByte2,
    MSEHasMovementFlags2,
    MSEHasGuidByte5,
    MSEHasGuidByte7,
    MSEHasTransportData,
    MSEHasGuidByte6,
    MSEHasSplineElevation,
    MSEHasGuidByte0,
    MSEHasGuidByte3,
    MSEHasPitch,
    MSEHasTimestamp,
    MSEHasFallData,
    MSEMovementFlags2,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte0,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte2,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte6,
    MSEHasFallDirection,
    MSEMovementFlags,
    MSEGuidByte0,
    MSEGuidByte4,
    MSEGuidByte7,
    MSEGuidByte5,
    MSEGuidByte6,
    MSEGuidByte3,
    MSEGuidByte2,
    MSEGuidByte1,
    MSEFallSinAngle,
    MSEFallCosAngle,
    MSEFallHorizontalSpeed,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSETransportGuidByte0,
    MSETransportPositionX,
    MSETransportTime,
    MSETransportSeat,
    MSETransportPositionZ,
    MSETransportGuidByte4,
    MSETransportOrientation,
    MSETransportGuidByte2,
    MSETransportGuidByte6,
    MSETransportGuidByte1,
    MSETransportGuidByte3,
    MSETransportPositionY,
    MSETransportTime3,
    MSETransportTime2,
    MSETransportGuidByte5,
    MSETransportGuidByte7,
    MSETimestamp,
    MSEPitch,
    MSEOrientation,
    MSESplineElevation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartTurnRightSequence[] =
{
    MSEPositionX,
    MSEPositionZ,
    MSEPositionY,
    MSEHasGuidByte3,
    MSEHasGuidByte5,
    MSEHasMovementFlags,
    MSEHasSpline,
    MSEHasGuidByte0,
    MSEHasOrientation,
    MSEHasTransportData,
    MSEHasGuidByte7,
    MSEZeroBit,
    MSEHasMovementFlags2,
    MSEHasGuidByte1,
    MSEHasTimestamp,
    MSEHasGuidByte6,
    MSEHasGuidByte2,
    MSEHasGuidByte4,
    MSEHasSplineElevation,
    MSEHasPitch,
    MSEHasFallData,
    MSEHasTransportGuidByte1,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte7,
    MSEHasTransportTime3,
    MSEMovementFlags2,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEGuidByte5,
    MSEGuidByte0,
    MSEGuidByte7,
    MSEGuidByte3,
    MSEGuidByte2,
    MSEGuidByte1,
    MSEGuidByte4,
    MSEGuidByte6,
    MSETransportPositionY,
    MSETransportGuidByte0,
    MSETransportGuidByte4,
    MSETransportGuidByte1,
    MSETransportGuidByte6,
    MSETransportGuidByte2,
    MSETransportSeat,
    MSETransportOrientation,
    MSETransportGuidByte5,
    MSETransportTime3,
    MSETransportPositionZ,
    MSETransportPositionX,
    MSETransportTime,
    MSETransportGuidByte7,
    MSETransportGuidByte3,
    MSETransportTime2,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallCosAngle,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSEPitch,
    MSEOrientation,
    MSESplineElevation,
    MSETimestamp,
    MSEEnd,
};

//5.0.5 16048
MovementStatusElements MovementStopSequence[] =
{
    MSEPositionY,
    MSEPositionZ,
    MSEPositionX,

    MSEHasFallData,     //IsInterpolated
    MSEZeroBit,         //isAlive32
    MSEZeroBit,         //isAlive_unk1
    MSEHasOrientation,  //unk _AH & 0x44
    MSEHasGuidByte2,    //Guid2
    MSEHasGuidByte1,    //Guid1
    MSEZeroBit,         //!isAlive_unk3
    MSEHasGuidByte4,    //Guid4

    MSEHasSplineElevation,  //unk _AH & 0x44
    MSEHasGuidByte6,        //Guid6
    MSEHasMovementFlags2,   //MoveFlags2
    MSEZeroBit,             //isAlive_unk4
    MSEHasMovementFlags,    //MoveFlags
    MSEHasGuidByte5,        //Guid5
    MSEHasGuidByte0,        //Guid0
    MSEHasGuidByte3,        //Guid3

    //begin BitCounter1 values on 24bits
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    MSEZeroBit, //unk
    //end bitCounter1 values

    MSEZeroBit,                 //isAlive_unk2
    MSEHasGuidByte7,            //Guid7
    MSEHasTransportData,        //isTransport
    MSEZeroBit,                 //_AH & 0x44
    MSEHasTransportGuidByte6,   //TransGuid6
    MSEHasTransportGuidByte1,   //TransGuid1
    MSEHasTransportGuidByte1,   //TransGuid4
    MSEZeroBit,                 //transport_unk2
    MSEHasTransportGuidByte0,   //TransGuid0
    MSEHasTransportGuidByte7,   //TransGuid7

    MSEZeroBit,                 //transport_unk1
    MSEHasTransportGuidByte5,   //Guid5
    MSEHasTransportGuidByte2,   //Guid2
    MSEHasTransportGuidByte3,   //Guid3
    MSEHasFallDirection,        //IsInterpolated
    MSEMovementFlags,           //MoveFlags
    MSEMovementFlags2,          //MoveFlags2

    //do uint32 unk while BitCounter1 > 0

    MSEGuidByte6,   //GuidByte6
    MSEGuidByte5,   //GuidByte5
    MSEGuidByte1,   //GuidByte1
    MSEGuidByte7,   //GuidByte7
    MSEGuidByte3,   //GuidByte3
    MSEGuidByte2,   //GuidByte2
    MSEGuidByte0,   //GuidByte0
    MSEGuidByte4,   //GuidByte4

    MSETransportPositionZ,  //TransportZ
    MSETransportGuidByte2,  //TransGuidByte2
    MSETransportPositionY,  //TransportY
    MSETransportGuidByte0,  //TransGuidByte0
    MSETransportGuidByte3,  //TransGuidByte3
    MSETransportPositionX,  //TransportX
    MSETransportSeat,       //TransportSeat
    MSETransportOrientation,//TransportO
    MSETransportGuidByte5,  //TransGuidByte5
    MSETransportTime,       //TransportTime
    MSETransportGuidByte6,  //TransGuidByte6
    MSETransportGuidByte7,  //TransGuidByte7
    MSETransportGuidByte4,  //TransGuidByte4
    MSETransportTime2,      //transport_unk2
    MSETransportGuidByte1,  //TransGuidByte1
    MSETransportTime,       //transport_unk1

    MSEPitch,               //Pitch
    MSETimestamp,           //isAlive32
    
    MSEFallHorizontalSpeed, //xySpeed   
    MSEFallSinAngle,        //sinAngle
    MSEFallCosAngle,        //cosAngle
    MSEFallVerticalSpeed,   //zSpeed
    MSEOrientation,         //Orientation
    MSESplineElevation,     //SplineElevation

    //nisAlive_unk3
    MSEZeroBit,
    MSEZeroBit,
    MSEZeroBit,
    MSEZeroBit,

    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStopStrafeSequence[] =
{
    MSEPositionY,
    MSEPositionZ,
    MSEPositionX,
    MSEHasPitch,
    MSEHasTimestamp,
    MSEHasGuidByte2,
    MSEHasFallData,
    MSEHasGuidByte7,
    MSEHasSplineElevation,
    MSEHasGuidByte3,
    MSEHasOrientation,
    MSEHasMovementFlags2,
    MSEHasTransportData,
    MSEHasMovementFlags,
    MSEHasSpline,
    MSEHasGuidByte0,
    MSEZeroBit,
    MSEHasGuidByte6,
    MSEHasGuidByte5,
    MSEHasGuidByte1,
    MSEHasGuidByte4,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte5,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte3,
    MSEHasTransportTime3,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEMovementFlags2,
    MSEGuidByte2,
    MSEGuidByte7,
    MSEGuidByte3,
    MSEGuidByte4,
    MSEGuidByte5,
    MSEGuidByte6,
    MSEGuidByte1,
    MSEGuidByte0,
    MSETransportSeat,
    MSETransportGuidByte6,
    MSETransportPositionZ,
    MSETransportTime3,
    MSETransportGuidByte1,
    MSETransportGuidByte3,
    MSETransportGuidByte2,
    MSETransportGuidByte4,
    MSETransportGuidByte5,
    MSETransportTime,
    MSETransportOrientation,
    MSETransportPositionX,
    MSETransportGuidByte0,
    MSETransportPositionY,
    MSETransportTime2,
    MSETransportGuidByte7,
    MSEFallCosAngle,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSESplineElevation,
    MSEOrientation,
    MSEPitch,
    MSETimestamp,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStopTurnSequence[] =
{
    MSEPositionX,
    MSEPositionZ,
    MSEPositionY,
    MSEHasGuidByte5,
    MSEHasGuidByte4,
    MSEHasFallData,
    MSEZeroBit,
    MSEHasGuidByte1,
    MSEHasGuidByte0,
    MSEHasSpline,
    MSEHasMovementFlags,
    MSEHasGuidByte2,
    MSEHasGuidByte6,
    MSEHasPitch,
    MSEHasTransportData,
    MSEHasGuidByte3,
    MSEHasSplineElevation,
    MSEHasTimestamp,
    MSEHasMovementFlags2,
    MSEHasOrientation,
    MSEHasGuidByte7,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte7,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte4,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte1,
    MSEHasFallDirection,
    MSEMovementFlags,
    MSEMovementFlags2,
    MSEGuidByte3,
    MSEGuidByte2,
    MSEGuidByte6,
    MSEGuidByte4,
    MSEGuidByte0,
    MSEGuidByte7,
    MSEGuidByte1,
    MSEGuidByte5,
    MSESplineElevation,
    MSETransportPositionX,
    MSETransportGuidByte5,
    MSETransportSeat,
    MSETransportGuidByte2,
    MSETransportGuidByte3,
    MSETransportOrientation,
    MSETransportTime2,
    MSETransportTime3,
    MSETransportGuidByte7,
    MSETransportGuidByte1,
    MSETransportGuidByte0,
    MSETransportGuidByte4,
    MSETransportPositionY,
    MSETransportPositionZ,
    MSETransportTime,
    MSETransportGuidByte6,
    MSEFallTime,
    MSEFallHorizontalSpeed,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEFallVerticalSpeed,
    MSETimestamp,
    MSEPitch,
    MSEOrientation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartAscendSequence[] =
{
    MSEPositionX,
    MSEPositionY,
    MSEPositionZ,
    MSEHasGuidByte0,
    MSEHasGuidByte1,
    MSEHasGuidByte7,
    MSEZeroBit,
    MSEHasGuidByte5,
    MSEHasTransportData,
    MSEHasGuidByte2,
    MSEHasSplineElevation,
    MSEHasFallData,
    MSEHasSpline,
    MSEHasGuidByte3,
    MSEHasMovementFlags2,
    MSEHasGuidByte6,
    MSEHasMovementFlags,
    MSEHasPitch,
    MSEHasTimestamp,
    MSEHasOrientation,
    MSEHasGuidByte4,
    MSEMovementFlags,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte2,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte4,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte7,
    MSEMovementFlags2,
    MSEHasFallDirection,
    MSEGuidByte6,
    MSEGuidByte3,
    MSEGuidByte1,
    MSEGuidByte4,
    MSEGuidByte2,
    MSEGuidByte0,
    MSEGuidByte5,
    MSEGuidByte7,
    MSETransportGuidByte3,
    MSETransportGuidByte5,
    MSETransportGuidByte4,
    MSETransportSeat,
    MSETransportGuidByte2,
    MSETransportOrientation,
    MSETransportPositionY,
    MSETransportGuidByte7,
    MSETransportTime2,
    MSETransportPositionZ,
    MSETransportTime3,
    MSETransportGuidByte6,
    MSETransportTime,
    MSETransportGuidByte0,
    MSETransportGuidByte1,
    MSETransportPositionX,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSEOrientation,
    MSEPitch,
    MSETimestamp,
    MSESplineElevation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartDescendSequence[] =
{
    MSEPositionY,
    MSEPositionZ,
    MSEPositionX,
    MSEHasGuidByte0,
    MSEHasPitch,
    MSEHasFallData,
    MSEHasGuidByte4,
    MSEHasOrientation,
    MSEHasTimestamp,
    MSEHasMovementFlags2,
    MSEHasMovementFlags,
    MSEHasGuidByte6,
    MSEZeroBit,
    MSEHasGuidByte1,
    MSEHasTransportData,
    MSEHasSpline,
    MSEHasSplineElevation,
    MSEHasGuidByte5,
    MSEHasGuidByte3,
    MSEHasGuidByte7,
    MSEHasGuidByte2,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte2,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte6,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte5,
    MSEMovementFlags2,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEGuidByte2,
    MSEGuidByte7,
    MSEGuidByte6,
    MSEGuidByte0,
    MSEGuidByte1,
    MSEGuidByte5,
    MSEGuidByte4,
    MSEGuidByte3,
    MSEPitch,
    MSETransportPositionZ,
    MSETransportSeat,
    MSETransportTime3,
    MSETransportGuidByte6,
    MSETransportTime2,
    MSETransportGuidByte1,
    MSETransportTime,
    MSETransportGuidByte4,
    MSETransportPositionY,
    MSETransportPositionX,
    MSETransportGuidByte7,
    MSETransportGuidByte3,
    MSETransportGuidByte5,
    MSETransportGuidByte2,
    MSETransportOrientation,
    MSETransportGuidByte0,
    MSEFallTime,
    MSEFallSinAngle,
    MSEFallCosAngle,
    MSEFallHorizontalSpeed,
    MSEFallVerticalSpeed,
    MSETimestamp,
    MSEOrientation,
    MSESplineElevation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartSwimSequence[] =
{
    MSEPositionZ,
    MSEPositionX,
    MSEPositionY,
    MSEHasGuidByte3,
    MSEHasSplineElevation,
    MSEHasGuidByte4,
    MSEHasGuidByte7,
    MSEZeroBit,
    MSEHasPitch,
    MSEHasGuidByte0,
    MSEHasOrientation,
    MSEHasMovementFlags,
    MSEHasFallData,
    MSEHasGuidByte5,
    MSEHasTransportData,
    MSEHasMovementFlags2,
    MSEHasTimestamp,
    MSEHasGuidByte6,
    MSEHasGuidByte1,
    MSEHasSpline,
    MSEHasGuidByte2,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte0,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte1,
    MSEHasTransportTime3,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEMovementFlags2,
    MSEGuidByte0,
    MSEGuidByte2,
    MSEGuidByte1,
    MSEGuidByte5,
    MSEGuidByte4,
    MSEGuidByte6,
    MSEGuidByte3,
    MSEGuidByte7,
    MSEPitch,
    MSETransportTime2,
    MSETransportGuidByte2,
    MSETransportPositionY,
    MSETransportGuidByte3,
    MSETransportTime,
    MSETransportPositionX,
    MSETransportOrientation,
    MSETransportTime3,
    MSETransportGuidByte6,
    MSETransportGuidByte5,
    MSETransportGuidByte4,
    MSETransportPositionZ,
    MSETransportGuidByte1,
    MSETransportGuidByte7,
    MSETransportGuidByte0,
    MSETransportSeat,
    MSEFallCosAngle,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSEOrientation,
    MSETimestamp,
    MSESplineElevation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStopSwimSequence[] =
{
    MSEPositionX,
    MSEPositionY,
    MSEPositionZ,
    MSEHasSpline,
    MSEHasPitch,
    MSEHasGuidByte5,
    MSEHasGuidByte3,
    MSEHasGuidByte7,
    MSEHasSplineElevation,
    MSEHasMovementFlags,
    MSEHasGuidByte4,
    MSEHasMovementFlags2,
    MSEHasGuidByte2,
    MSEHasGuidByte6,
    MSEHasTransportData,
    MSEHasOrientation,
    MSEZeroBit,
    MSEHasTimestamp,
    MSEHasGuidByte1,
    MSEHasGuidByte0,
    MSEHasFallData,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte0,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte5,
    MSEMovementFlags,
    MSEMovementFlags2,
    MSEHasFallDirection,
    MSEGuidByte0,
    MSEGuidByte4,
    MSEGuidByte3,
    MSEGuidByte6,
    MSEGuidByte7,
    MSEGuidByte1,
    MSEGuidByte5,
    MSEGuidByte2,
    MSETransportTime3,
    MSETransportGuidByte4,
    MSETransportTime,
    MSETransportPositionZ,
    MSETransportSeat,
    MSETransportGuidByte3,
    MSETransportGuidByte2,
    MSETransportPositionY,
    MSETransportGuidByte7,
    MSETransportGuidByte1,
    MSETransportGuidByte6,
    MSETransportGuidByte5,
    MSETransportTime2,
    MSETransportPositionX,
    MSETransportGuidByte0,
    MSETransportOrientation,
    MSEFallVerticalSpeed,
    MSEFallCosAngle,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallTime,
    MSETimestamp,
    MSEPitch,
    MSEOrientation,
    MSESplineElevation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStopAscendSequence[] =
{
    MSEPositionZ,
    MSEPositionY,
    MSEPositionX,
    MSEHasGuidByte3,
    MSEHasGuidByte2,
    MSEHasFallData,
    MSEHasGuidByte7,
    MSEHasOrientation,
    MSEHasPitch,
    MSEHasSpline,
    MSEZeroBit,
    MSEHasGuidByte1,
    MSEHasGuidByte4,
    MSEHasMovementFlags,
    MSEHasGuidByte0,
    MSEHasGuidByte6,
    MSEHasSplineElevation,
    MSEHasTransportData,
    MSEHasMovementFlags2,
    MSEHasTimestamp,
    MSEHasGuidByte5,
    MSEHasTransportTime2,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte2,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte0,
    MSEMovementFlags2,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEGuidByte7,
    MSEGuidByte5,
    MSEGuidByte4,
    MSEGuidByte3,
    MSEGuidByte2,
    MSEGuidByte1,
    MSEGuidByte0,
    MSEGuidByte6,
    MSETransportGuidByte5,
    MSETransportPositionY,
    MSETransportGuidByte7,
    MSETransportGuidByte2,
    MSETransportGuidByte6,
    MSETransportTime2,
    MSETransportTime3,
    MSETransportOrientation,
    MSETransportGuidByte3,
    MSETransportGuidByte4,
    MSETransportSeat,
    MSETransportGuidByte1,
    MSETransportTime,
    MSETransportGuidByte0,
    MSETransportPositionX,
    MSETransportPositionZ,
    MSEFallTime,
    MSEFallVerticalSpeed,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSEPitch,
    MSESplineElevation,
    MSETimestamp,
    MSEOrientation,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStopPitchSequence[] =
{
    MSEPositionY,
    MSEPositionX,
    MSEPositionZ,
    MSEHasGuidByte0,
    MSEHasGuidByte5,
    MSEHasGuidByte3,
    MSEHasFallData,
    MSEHasGuidByte2,
    MSEHasGuidByte4,
    MSEHasGuidByte7,
    MSEHasPitch,
    MSEHasSpline,
    MSEHasOrientation,
    MSEZeroBit,
    MSEHasMovementFlags2,
    MSEHasSplineElevation,
    MSEHasGuidByte6,
    MSEHasGuidByte1,
    MSEHasTimestamp,
    MSEHasTransportData,
    MSEHasMovementFlags,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte2,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte3,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte1,
    MSEHasFallDirection,
    MSEMovementFlags2,
    MSEMovementFlags,
    MSEGuidByte1,
    MSEGuidByte7,
    MSEGuidByte0,
    MSEGuidByte6,
    MSEGuidByte4,
    MSEGuidByte3,
    MSEGuidByte5,
    MSEGuidByte2,
    MSETimestamp,
    MSEFallHorizontalSpeed,
    MSEFallSinAngle,
    MSEFallCosAngle,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSETransportGuidByte5,
    MSETransportGuidByte2,
    MSETransportTime2,
    MSETransportPositionX,
    MSETransportOrientation,
    MSETransportGuidByte6,
    MSETransportGuidByte3,
    MSETransportGuidByte1,
    MSETransportPositionZ,
    MSETransportTime3,
    MSETransportGuidByte0,
    MSETransportGuidByte4,
    MSETransportTime,
    MSETransportPositionY,
    MSETransportSeat,
    MSETransportGuidByte7,
    MSESplineElevation,
    MSEOrientation,
    MSEPitch,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartPitchDownSequence[] =
{
    MSEPositionX,
    MSEPositionZ,
    MSEPositionY,
    MSEHasMovementFlags,
    MSEHasGuidByte7,
    MSEHasGuidByte6,
    MSEHasPitch,
    MSEZeroBit,
    MSEHasGuidByte1,
    MSEHasGuidByte4,
    MSEHasTimestamp,
    MSEHasSplineElevation,
    MSEHasMovementFlags2,
    MSEHasTransportData,
    MSEHasGuidByte0,
    MSEHasGuidByte5,
    MSEHasGuidByte3,
    MSEHasSpline,
    MSEHasOrientation,
    MSEHasFallData,
    MSEHasGuidByte2,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte5,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte6,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte2,
    MSEMovementFlags2,
    MSEHasFallDirection,
    MSEMovementFlags,
    MSEGuidByte3,
    MSEGuidByte7,
    MSEGuidByte0,
    MSEGuidByte5,
    MSEGuidByte2,
    MSEGuidByte6,
    MSEGuidByte4,
    MSEGuidByte1,
    MSETransportTime3,
    MSETransportGuidByte3,
    MSETransportTime2,
    MSETransportGuidByte5,
    MSETransportGuidByte1,
    MSETransportPositionY,
    MSETransportGuidByte6,
    MSETransportGuidByte4,
    MSETransportTime,
    MSETransportPositionZ,
    MSETransportPositionX,
    MSETransportGuidByte0,
    MSETransportSeat,
    MSETransportGuidByte2,
    MSETransportGuidByte7,
    MSETransportOrientation,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSEFallCosAngle,
    MSEFallVerticalSpeed,
    MSEFallTime,
    MSEPitch,
    MSEOrientation,
    MSESplineElevation,
    MSETimestamp,
    MSEEnd,
};

//4.3.4
MovementStatusElements MovementStartPitchUpSequence[] =
{
    MSEPositionZ,
    MSEPositionY,
    MSEPositionX,
    MSEHasGuidByte4,
    MSEHasMovementFlags,
    MSEHasMovementFlags2,
    MSEHasSpline,
    MSEHasGuidByte2,
    MSEHasGuidByte6,
    MSEHasGuidByte3,
    MSEZeroBit,
    MSEHasSplineElevation,
    MSEHasFallData,
    MSEHasGuidByte0,
    MSEHasTransportData,
    MSEHasGuidByte1,
    MSEHasGuidByte5,
    MSEHasPitch,
    MSEHasTimestamp,
    MSEHasOrientation,
    MSEHasGuidByte7,
    MSEMovementFlags2,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte1,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte4,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte2,
    MSEMovementFlags,
    MSEHasFallDirection,
    MSEGuidByte0,
    MSEGuidByte3,
    MSEGuidByte4,
    MSEGuidByte6,
    MSEGuidByte7,
    MSEGuidByte1,
    MSEGuidByte5,
    MSEGuidByte2,
    MSETransportPositionX,
    MSETransportGuidByte1,
    MSETransportGuidByte3,
    MSETransportGuidByte2,
    MSETransportGuidByte0,
    MSETransportTime,
    MSETransportPositionZ,
    MSETransportOrientation,
    MSETransportGuidByte7,
    MSETransportTime2,
    MSETransportSeat,
    MSETransportGuidByte6,
    MSETransportGuidByte5,
    MSETransportTime3,
    MSETransportPositionY,
    MSETransportGuidByte4,
    MSEFallTime,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEFallHorizontalSpeed,
    MSEFallVerticalSpeed,
    MSEOrientation,
    MSESplineElevation,
    MSEPitch,
    MSETimestamp,
    MSEEnd,
};

MovementStatusElements MoveChngTransport[]=
{
    MSEPositionY,
    MSEPositionX,
    MSEPositionZ,
    MSEHasGuidByte4,
    MSEHasGuidByte0,
    MSEHasGuidByte2,
    MSEHasTransportData,
    MSEHasSpline,
    MSEHasOrientation,
    MSEHasGuidByte6,
    MSEHasTimestamp,
    MSEHasGuidByte5,
    MSEHasGuidByte7,
    MSEHasPitch,
    MSEZeroBit,
    MSEHasGuidByte3,
    MSEHasSplineElevation,
    MSEHasGuidByte1,
    MSEHasFallData,
    MSEHasMovementFlags,
    MSEHasMovementFlags2,

    MSEHasTransportGuidByte3,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte6,
    MSEHasTransportGuidByte2,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte0,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte5,

    MSEMovementFlags,
    MSEMovementFlags2,
    MSEHasFallDirection,

    MSEGuidByte7,
    MSEGuidByte5,
    MSEGuidByte1,
    MSEGuidByte2,
    MSEGuidByte6,
    MSEGuidByte4,
    MSEGuidByte0,
    MSEGuidByte3,

    MSETransportPositionY,
    MSETransportSeat,
    MSETransportGuidByte1,
    MSETransportGuidByte0,
    MSETransportGuidByte2,
    MSETransportGuidByte3,
    MSETransportGuidByte6,
    MSETransportPositionZ,
    MSETransportPositionX,
    MSETransportTime3,
    MSETransportTime,
    MSETransportGuidByte7,
    MSETransportGuidByte5,
    MSETransportGuidByte4,
    MSETransportOrientation,
    MSETransportTime2,

    MSEFallTime,
    MSEFallHorizontalSpeed,
    MSEFallCosAngle,
    MSEFallSinAngle,
    MSEFallVerticalSpeed,

    MSEOrientation,
    MSEPitch,
    MSESplineElevation,
    MSETimestamp,
    MSEEnd,
};

// 4.3.4
MovementStatusElements MoveSplineDone[] =
{
    MSEPositionY,
    MSEPositionX,
    MSEPositionZ,
    MSEHasGuidByte6,
    MSEHasOrientation,
    MSEHasFallData,
    MSEHasTimestamp,
    MSEHasGuidByte2,
    MSEHasSplineElevation,
    MSEHasGuidByte4,
    MSEHasTransportData,
    MSEHasGuidByte3,
    MSEHasMovementFlags,
    MSEHasGuidByte0,
    MSEZeroBit,
    MSEHasGuidByte1,
    MSEHasGuidByte5,
    MSEHasPitch,
    MSEHasSpline,
    MSEHasMovementFlags2,
    MSEHasGuidByte7,

    MSEHasTransportGuidByte1,
    MSEHasTransportGuidByte7,
    MSEHasTransportGuidByte5,
    MSEHasTransportGuidByte3,
    MSEHasTransportGuidByte4,
    MSEHasTransportGuidByte6,
    MSEHasTransportTime2,
    MSEHasTransportGuidByte2,
    MSEHasTransportTime3,
    MSEHasTransportGuidByte0,

    MSEHasFallDirection,
    MSEMovementFlags2,
    MSEMovementFlags,

    MSEGuidByte7,
    MSEGuidByte4,
    MSEGuidByte5,
    MSEGuidByte6,
    MSEGuidByte0,
    MSEGuidByte1,
    MSEGuidByte2,
    MSEGuidByte3,

    MSEFallVerticalSpeed,
    MSEFallSinAngle,
    MSEFallCosAngle,
    MSEFallHorizontalSpeed,
    MSEFallTime,

    MSEPitch,
    MSEOrientation,

    MSETransportGuidByte1,
    MSETransportTime3,
    MSETransportGuidByte7,
    MSETransportTime,
    MSETransportPositionY,
    MSETransportPositionX,
    MSETransportPositionZ,
    MSETransportSeat,
    MSETransportOrientation,
    MSETransportGuidByte0,
    MSETransportTime2,
    MSETransportGuidByte2,
    MSETransportGuidByte3,
    MSETransportGuidByte5,
    MSETransportGuidByte6,
    MSETransportGuidByte4,

    MSETimestamp,
    MSESplineElevation,
    MSEEnd,
};

MovementStatusElements* GetMovementStatusElementsSequence(Opcodes opcode)
{
    switch (opcode)
    {
        case CMSG_CAST_SPELL:       // Cast spell has movement data part when castflags & 0x10, patched ClientSide to have same data of CMSG_PLAYER_MOVE
        case CMSG_PLAYER_MOVE:
            return MovementStartForwardSequence;
        case SMSG_MOVE_UPDATE:
            return PlayerMoveSequence;
        default:
            break;
    }

    return NULL;
}

#endif
